{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Sagemath快速入门"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "source": [
    "![](images/2019-07-04_06-14-51.png)"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "source": [
    "执行单元: ⟨shift-enter⟩\n",
    "执行单元并新建单元: ⟨alt-enter⟩\n",
    "分割单元: ⟨control-;⟩\n",
    "合并单元: ⟨control-backspace⟩\n",
    "插入数学单元: 点击单元间的蓝线\n",
    "插入文本/HTML 单元: shift-点击单元间的蓝线\n",
    "删除单元: 删除内容后退格 (backspace)\n",
    "\n",
    "命令行\n",
    "---------\n",
    "com⟨tab⟩ 自动完成 command\n",
    "*bar*? 列出所有包含 “bar” 的命令\n",
    "command?⟨tab⟩ 显示文档\n",
    "command??⟨tab⟩ 显示源代码\n",
    "a.⟨tab⟩ 显示对象a 的方法 (或 dir(a))\n",
    "a._⟨tab⟩ 显示对象 a 的隐藏方法\n",
    "search_doc(\"string or regexp\") 文档全文搜索\n",
    "search_src(\"string or regexp\") 搜索源代码\n",
    "_ 前一项输出\n",
    "\n"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "source": [
    "数\n",
    "***\n",
    "整数: Z = ZZ 例 -2 -1 0 1 10^100\n",
    "有理数: Q = QQ 例 1/2 1/1000 314/100 -2/1\n",
    "实数: R ≈ RR 例 .5 0.001 3.14 1.23e10000\n",
    "复数: C ≈ CC 例 CC(1,1) CC(2.5,-3)\n",
    "双精度: RDF 与 CDF 例 CDF(2.1,3)\n",
    "模 n 剩余类: Z/nZ = Zmod 例 Mod(2,3) Zmod(3)(2)\n",
    "有限域: Fq = GF 例 GF(3)(2) GF(9,\"a\").0\n",
    "多项式: R[x, y] 例 S.<x,y>=QQ[] x+2*y^3\n",
    "幂级数: R[[t]] 例 S.<t>=QQ[[]] 1/2+2*t+O(t^2)\n",
    "p 进整数: Zp ≈Zp, Qp ≈Qp 例 2+3*5+O(5^2)\n",
    "代数闭包: Q = QQbar 例 QQbar(2^(1/5))\n",
    "区间算术: RIF 例 sage: RIF((1,1.00001))\n",
    "数域: R.<x>=QQ[];K.<a>=NumberField(x^3+x+1)\n",
    "\n",
    "离散数学\n",
    "⌊x⌋ = floor(x) ⌈x⌉ = ceil(x)\n",
    "n 除以 k 的余数 = n%k k|n iff n%k==0\n",
    "n! = factorial(n) \n",
    "二项式系数 binomial(n,m)\n",
    "ϕ(n) = euler_phi(n)\n",
    "字符串: 例 s = \"Hello\" = \"He\"+'llo'\n",
    "s[0]=\"H\" s[-1]=\"o\" s[1:3]=\"el\" s[3:]=\"lo\" s[0:4:2]='Hl'\n",
    "列表: 例 [1,\"Hello\",x] = []+[1,\"Hello\"]+[x]\n",
    "元组: 例 (1,\"Hello\",x) (immutable)\n",
    "集合: 例 {1, 2, 1, a} = Set([1,2,1,\"a\"]) (= {1, 2, a})\n",
    "列表推导式 ≈ 描述法表示集合 (set builder notation), 例\n",
    "{f(x) : x ∈ X, x > 0} = Set([f(x) for x in X if x>0])\n",
    "\n",
    "图论\n",
    "图: G = Graph({0:[1,2,3], 2:[4]})\n",
    "有向图: DiGraph(dictionary)\n",
    "图族: graphs.⟨tab⟩\n",
    "不变量: G.chromatic_polynomial(), G.is_planar()\n",
    "路径: G.shortest_path()\n",
    "可视化: G.plot(), G.plot3d()\n",
    "自同构: G.automorphism_group(),\n",
    "G1.is_isomorphic(G2), G1.is_subgraph(G2)\n",
    "\n",
    "组合学\n",
    "整数序列: sloane_find(list), sloane.⟨tab⟩\n",
    "分划: P=Partitions(n) P.count()\n",
    "组合: C=Combinations(list) C.list()\n",
    "笛卡尔积: CartesianProduct(P,C)\n",
    "Tableau: Tableau([[1,2,3],[4,5]])\n",
    "字: W=Words(\"abc\"); W(\"aabca\")\n",
    "偏序集: Poset([[1,2],[4],[3],[4],[]])\n",
    "根系: RootSystem([\"A\",3])\n",
    "Crystals: CrystalOfTableaux([\"A\",3], shape=[3,2])\n",
    "Lattice Polytopes: A=random_matrix(ZZ,3,6,x=7)\n",
    "L=LatticePolytope(A) L.npoints() L.plot3d()\n",
    "\n",
    "算术\n",
    "a*b a/b a^b √x = sqrt(x) x^(1/n) abs(x) logb(x) = log(x,b)\n",
    "和:∑(i=k..n,f(i)) = sum(f(i) for i in (k..n))\n",
    "积:\n",
    "∏(i=k..n,f(i)) = prod(f(i) for i in (k..n))\n",
    "\n",
    "\n",
    "常数与函数\n",
    "常数: π = pi e = e i = i ∞ = oo\n",
    "ϕ = golden_ratio γ = euler_gamma\n",
    "π 近似值: pi.n(digits=18) = 3.14159265358979324\n",
    "函数: sin cos tan sec csc cot sinh cosh tanh\n",
    "sech csch coth log ln exp ...\n",
    "Python 函数: def f(x): return x^2\n",
    "\n",
    "\n",
    "交互函数\n",
    "把 @interact 放在函数前 (vars determine controls)\n",
    "@interact\n",
    "def f(n=[0..4], s=(1..5), c=Color(\"red\")):\n",
    "  var(\"x\");show(plot(sin(n+x^s),-pi,pi,color=c))\n",
    "  \n",
    "符号式\n",
    "定义新符号变元: var(\"t u v y z\")\n",
    "符号函数: 例 f(x)=x^2\n",
    "关系式: f==g f<=g f>=g f<g f>g\n",
    "求解 f = g: solve(f(x)==g(x), x)\n",
    "solve([f(x,y)==0, g(x,y)==0], x,y)\n",
    "factor(...) expand(...) (...).simplify_...\n",
    "find_root(f(x), a, b) 寻找 x ∈ [a, b] s.t. f(x) ≈ 0\n",
    "\n",
    "微积分\n",
    "limx→a\n",
    "f(x) = limit(f(x), x=a)\n",
    "d\n",
    "dx (f(x)) = diff(f(x),x)\n",
    "∂\n",
    "∂x (f(x, y)) = diff(f(x,y),x)\n",
    "diff = differentiate = derivative\n",
    "∫\n",
    "f(x)dx = integral(f(x),x)\n",
    "∫ b\n",
    "a\n",
    "f(x)dx = integral(f(x),x,a,b)\n",
    "∫ b\n",
    "a\n",
    "f(x)dx ≈ numerical_integral(f(x),a,b)\n",
    "a 点的 n 次 Taylor 多项式: taylor(f(x),x,a,n)\n",
    "\n",
    "\n",
    "矩阵代数\n",
    "vector([1,2])\n",
    "matrix(QQ,[[1,2],[3,4]], sparse=False)\n",
    "(1 2 3\n",
    "4 5 6)\n",
    "= matrix(QQ,2,3,[1,2,3, 4,5,6])\n",
    "det(matrix(QQ,[[1,2],[3,4]]))\n",
    "Av = A*v A−1 = A^-1 At = A.transpose()\n",
    "求解 Ax = v: A\\v 或 A.solve_right(v)\n",
    "求解 xA = v: A.solve_left(v)\n",
    "约化行阶梯型: A.echelon_form()\n",
    "秩与零度: A.rank() A.nullity()\n",
    "Hessenberg 型: A.hessenberg_form()\n",
    "特征多项式: A.charpoly()\n",
    "特征值: A.eigenvalues()\n",
    "特征向量: A.eigenvectors_right() (also left)\n",
    "Gram-Schmidt 正交化: A.gram_schmidt()\n",
    "可视化: A.plot()\n",
    "LLL 约化: matrix(ZZ,...).LLL()\n",
    "Hermite 型: matrix(ZZ,...).hermite_form()\n",
    "\n",
    "\n",
    "线性代数\n",
    "向量空间 Kn = K^n 例 QQ^3 RR^2 CC^4\n",
    "子空间: span(vectors, field )\n",
    "例, span([[1,2,3], [2,3,5]], QQ)\n",
    "核: A.right_kernel() (also left)\n",
    "和与交: V + W and V.intersection(W)\n",
    "基: V.basis()\n",
    "基矩阵: V.basis_matrix()\n",
    "矩阵限制在子空间: A.restrict(V)\n",
    "向量在基下的坐标: V.coordinates(vector)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "source": [
    "2D 作图\n",
    "line([(x1,y1),. . .,(xn,yn)],options)\n",
    "polygon([(x1,y1),. . .,(xn,yn)],options)\n",
    "circle((x,y),r,options)\n",
    "text(\"txt\",(x,y),options)\n",
    "options 与 plot.options 用法相同, 例 thickness=pixel,\n",
    "rgbcolor=(r,g,b), hue=h 其中 0 ≤ r, b, g, h ≤ 1\n",
    "show(graphic, options)\n",
    "使用 figsize=[w,h] 调整大小\n",
    "使用 aspect_ratio=number 调整纵横比\n",
    "plot(f(x),(x, xmin, xmax),options)\n",
    "parametric_plot((f(t),g(t)),(t, tmin, tmax),options)\n",
    "polar_plot(f(t),(t, tmin, tmax),options)\n",
    "结合: circle((1,1),1)+line([(0,0),(2,2)])\n",
    "animate(list of graphics, options).show(delay=20)\n",
    "\n",
    "\n",
    "3D 作图\n",
    "line3d([(x1,y1,z1),. . .,(xn,yn,zn)],options)\n",
    "sphere((x,y,z),r,options)\n",
    "text3d(\"txt\", (x,y,z), options)\n",
    "tetrahedron((x,y,z),size,options)\n",
    "cube((x,y,z),size,options)\n",
    "octahedron((x,y,z),size,options)\n",
    "dodecahedron((x,y,z),size,options)\n",
    "icosahedron((x,y,z),size,options)\n",
    "plot3d(f(x, y),(x, xb, xe), (y, yb, ye),options)\n",
    "parametric_plot3d((f,g,h),(t, tb, te),options)\n",
    "parametric_plot3d((f(u, v),g(u, v),h(u, v)),\n",
    "(u, ub, ue),(v, vb, ve),options)\n",
    "options: aspect_ratio=[1, 1, 1], color=\"red\"\n",
    "opacity=0.5, figsize=6, viewer=\"tachyon\"\n",
    "\n",
    "\n",
    "数值计算\n",
    "包: import numpy, scipy, cvxopt\n",
    "最小化: var(\"x y z\")\n",
    "minimize(x^2+x*y^3+(1-z)^2-1, [1,1,1])\n",
    "\n",
    "\n",
    "数论\n",
    "素数: prime_range(n,m), is_prime, next_prime primes_first_n, prime_pi\n",
    "素因数分解: factor(n), qsieve(n), ecm.factor(n)\n",
    "extended gcd g = sa + tb = gcd(a, b): g,s,t=xgcd(a,b)\n",
    "Kronecker 符号: kronecker_symbol(a,b)\n",
    "连分数: continued_fraction(x)\n",
    "Bernoulli 数: bernoulli(n), bernoulli_mod_p(p)\n",
    "椭圆曲线: EllipticCurve([a1, a2, a3, a4, a6])\n",
    "Dirichlet 特征: DirichletGroup(N)\n",
    "模形式: ModularForms(level, weight)\n",
    "Modular symbols: ModularSymbols(level, weight, sign)\n",
    "Brandt 模: BrandtModule(level, weight)\n",
    "Modular abelian 簇: J0(N), J1(N)\n",
    "\n",
    "\n",
    "群论\n",
    "G = PermutationGroup([[(1,2,3),(4,5)],[(3,4)]])\n",
    "SymmetricGroup(n), AlternatingGroup(n)\n",
    "交换群: AbelianGroup([3,15])\n",
    "矩阵群: GL, SL, Sp, SU, GU, SO, GO\n",
    "函数: G.sylow_subgroup(p), G.character_table(),\n",
    "G.normal_subgroups(), G.cayley_graph()\n",
    "\n",
    "非交换环\n",
    "四元数: Q.<i,j,k> = QuaternionAlgebra(a,b)\n",
    "自由代数: R.<a,b,c> = FreeAlgebra(QQ, 3)\n",
    "\n",
    "Python 模块\n",
    "import module_name\n",
    "module_name.⟨tab⟩ 与 help(module_name)\n",
    "\n",
    "分析与调试\n",
    "time command: 显示时间信息\n",
    "timeit(\"command\"): 精确时间控制\n",
    "t = cputime(); cputime(t): CPU 运行时间\n",
    "t = walltime(); walltime(t): 系统时间\n",
    "%pdb: 开启交互调试 (仅在命令行)\n",
    "%prun command: 配置命令 (仅在命令行)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 73,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "is_prime(257)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, -9, 8)"
      ]
     },
     "execution_count": 78,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgcd(93,105)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 79,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Mod(3,97).sqrt()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([1099511627776], '')"
      ]
     },
     "execution_count": 72,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qsieve(10^40)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.0017241187756944104, 119.39222002640398, 1.0)"
      ]
     },
     "execution_count": 68,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "var(\"x y z\")\n",
    "minimize(x^2+x*y^3+(1-z)^2-1, [1,1,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/html": "\n<iframe srcdoc=\"\n<html>\n<head>\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      overflow: hidden;\n    }\n    body, html {      \n      height: 100%;\n      width: 100%;\n    }\n  </style>\n  <script type=&quot;text/javascript&quot; src=&quot;/nbextensions/jsmol/JSmol.min.js&quot;></script>\n</head>\n<body>\n  <script type=&quot;text/javascript&quot;>\n    var script = [\n  'data &quot;model list&quot;',\n  '10',\n  'empty',\n  'Xx -2.61803398875 -3.80251707689 -3.0',\n  'Xx 0.0 -3.80251707689 -3.0',\n  'Xx 2.61803398875 -3.80251707689 -3.0',\n  'Xx 3.61803398875 -2.80251707689 -3.0',\n  'Xx 3.61803398875 0.0 -3.0',\n  'Xx 3.61803398875 2.80251707689 -3.0',\n  'Xx -3.61803398875 -2.80251707689 -3.0',\n  'Xx -3.61803398875 -2.80251707689 0.0',\n  'Xx -3.61803398875 -2.80251707689 3.0',\n  'Xx 5.5 5.5 5.5',\n  'end &quot;model list&quot;; show data',\n  'select *',\n  'wireframe off; spacefill off',\n  'set labelOffset 0 0',\n  'background [255,255,255]',\n  'spin OFF',\n  'moveto 0 -764 -346 -545 76.39',\n  'centerAt absolute {0 0 0}',\n  'zoom 100',\n  'frank OFF',\n  'set perspectivedepth ON',\n  'pmesh obj_1 inline &quot;60',\n  '0 0 3',\n  '2 0 2.23607',\n  '-1 1.73205 2.23607',\n  '-1 -1.73205 2.23607',\n  '2.23607 1.73205 1',\n  '0.381966 2.80252 1',\n  '-2.61803 1.07047 1',\n  '-2.61803 -1.07047 1',\n  '0.381966 -2.80252 1',\n  '2.23607 -1.73205 1',\n  '-2.23607 1.73205 -1',\n  '-0.381966 2.80252 -1',\n  '2.61803 1.07047 -1',\n  '2.61803 -1.07047 -1',\n  '-0.381966 -2.80252 -1',\n  '-2.23607 -1.73205 -1',\n  '1 1.73205 -2.23607',\n  '1 -1.73205 -2.23607',\n  '-2 0 -2.23607',\n  '0 0 -3',\n  '0 0 3',\n  '2 0 2.23607',\n  '-1 1.73205 2.23607',\n  '-1 -1.73205 2.23607',\n  '2.23607 1.73205 1',\n  '0.381966 2.80252 1',\n  '-2.61803 1.07047 1',\n  '-2.61803 -1.07047 1',\n  '0.381966 -2.80252 1',\n  '2.23607 -1.73205 1',\n  '-2.23607 1.73205 -1',\n  '-0.381966 2.80252 -1',\n  '2.61803 1.07047 -1',\n  '2.61803 -1.07047 -1',\n  '-0.381966 -2.80252 -1',\n  '-2.23607 -1.73205 -1',\n  '1 1.73205 -2.23607',\n  '1 -1.73205 -2.23607',\n  '-2 0 -2.23607',\n  '0 0 -3',\n  '0 0 3',\n  '2 0 2.23607',\n  '-1 1.73205 2.23607',\n  '-1 -1.73205 2.23607',\n  '2.23607 1.73205 1',\n  '0.381966 2.80252 1',\n  '-2.61803 1.07047 1',\n  '-2.61803 -1.07047 1',\n  '0.381966 -2.80252 1',\n  '2.23607 -1.73205 1',\n  '-2.23607 1.73205 -1',\n  '-0.381966 2.80252 -1',\n  '2.61803 1.07047 -1',\n  '2.61803 -1.07047 -1',\n  '-0.381966 -2.80252 -1',\n  '-2.23607 -1.73205 -1',\n  '1 1.73205 -2.23607',\n  '1 -1.73205 -2.23607',\n  '-2 0 -2.23607',\n  '0 0 -3',\n  '36',\n  '4',\n  '0',\n  '1',\n  '4',\n  '0',\n  '4',\n  '0',\n  '4',\n  '5',\n  '0',\n  '4',\n  '0',\n  '5',\n  '2',\n  '0',\n  '4',\n  '20',\n  '22',\n  '6',\n  '20',\n  '4',\n  '20',\n  '6',\n  '7',\n  '20',\n  '4',\n  '20',\n  '7',\n  '3',\n  '20',\n  '4',\n  '40',\n  '23',\n  '8',\n  '40',\n  '4',\n  '40',\n  '8',\n  '9',\n  '40',\n  '4',\n  '40',\n  '9',\n  '21',\n  '40',\n  '4',\n  '41',\n  '29',\n  '13',\n  '41',\n  '4',\n  '41',\n  '13',\n  '12',\n  '41',\n  '4',\n  '41',\n  '12',\n  '24',\n  '41',\n  '4',\n  '42',\n  '25',\n  '11',\n  '42',\n  '4',\n  '42',\n  '11',\n  '10',\n  '42',\n  '4',\n  '42',\n  '10',\n  '26',\n  '42',\n  '4',\n  '43',\n  '27',\n  '15',\n  '43',\n  '4',\n  '43',\n  '15',\n  '14',\n  '43',\n  '4',\n  '43',\n  '14',\n  '28',\n  '43',\n  '4',\n  '17',\n  '34',\n  '35',\n  '17',\n  '4',\n  '17',\n  '35',\n  '18',\n  '17',\n  '4',\n  '17',\n  '18',\n  '19',\n  '17',\n  '4',\n  '16',\n  '32',\n  '33',\n  '16',\n  '4',\n  '16',\n  '33',\n  '37',\n  '16',\n  '4',\n  '16',\n  '37',\n  '39',\n  '16',\n  '4',\n  '38',\n  '30',\n  '31',\n  '38',\n  '4',\n  '38',\n  '31',\n  '36',\n  '38',\n  '4',\n  '38',\n  '36',\n  '59',\n  '38',\n  '4',\n  '55',\n  '47',\n  '46',\n  '55',\n  '4',\n  '55',\n  '46',\n  '50',\n  '55',\n  '4',\n  '55',\n  '50',\n  '58',\n  '55',\n  '4',\n  '53',\n  '49',\n  '48',\n  '53',\n  '4',\n  '53',\n  '48',\n  '54',\n  '53',\n  '4',\n  '53',\n  '54',\n  '57',\n  '53',\n  '4',\n  '51',\n  '45',\n  '44',\n  '51',\n  '4',\n  '51',\n  '44',\n  '52',\n  '51',\n  '4',\n  '51',\n  '52',\n  '56',\n  '51&quot;',\n  'color pmesh  [102,102,255]',\n  'draw line_2 diameter 1 curve {-2.61803398875 -2.80251707689 -3.0}  {-2.61803398875 2.80251707689 -3.0} ',\n  'color $line_2 translucent 0.5 [0,0,0]',\n  'draw line_3 diameter 1 curve {-2.61803398875 2.80251707689 -3.0}  {2.61803398875 2.80251707689 -3.0} ',\n  'color $line_3 translucent 0.5 [0,0,0]',\n  'draw line_4 diameter 1 curve {2.61803398875 2.80251707689 -3.0}  {2.61803398875 -2.80251707689 -3.0} ',\n  'color $line_4 translucent 0.5 [0,0,0]',\n  'draw line_5 diameter 1 curve {2.61803398875 -2.80251707689 -3.0}  {-2.61803398875 -2.80251707689 -3.0} ',\n  'color $line_5 translucent 0.5 [0,0,0]',\n  'draw line_6 diameter 1 curve {-2.61803398875 -2.80251707689 -3.0}  {-2.61803398875 -2.80251707689 3.0} ',\n  'color $line_6 translucent 0.5 [0,0,0]',\n  'draw line_7 diameter 1 curve {-2.61803398875 -2.80251707689 3.0}  {-2.61803398875 2.80251707689 3.0} ',\n  'color $line_7 translucent 0.5 [0,0,0]',\n  'draw line_8 diameter 1 curve {-2.61803398875 2.80251707689 3.0}  {2.61803398875 2.80251707689 3.0} ',\n  'color $line_8 translucent 0.5 [0,0,0]',\n  'draw line_9 diameter 1 curve {2.61803398875 2.80251707689 3.0}  {2.61803398875 -2.80251707689 3.0} ',\n  'color $line_9 translucent 0.5 [0,0,0]',\n  'draw line_10 diameter 1 curve {2.61803398875 -2.80251707689 3.0}  {-2.61803398875 -2.80251707689 3.0} ',\n  'color $line_10 translucent 0.5 [0,0,0]',\n  'draw line_11 diameter 1 curve {-2.61803398875 -2.80251707689 3.0} ',\n  'color $line_11 translucent 0.5 [0,0,0]',\n  'draw line_12 diameter 1 curve {-2.61803398875 2.80251707689 -3.0}  {-2.61803398875 2.80251707689 3.0} ',\n  'color $line_12 translucent 0.5 [0,0,0]',\n  'draw line_13 diameter 1 curve {2.61803398875 -2.80251707689 -3.0}  {2.61803398875 -2.80251707689 3.0} ',\n  'color $line_13 translucent 0.5 [0,0,0]',\n  'draw line_14 diameter 1 curve {2.61803398875 2.80251707689 -3.0}  {2.61803398875 2.80251707689 3.0} ',\n  'color $line_14 translucent 0.5 [0,0,0]',\n  'select atomno = 1',\n  'color atom  [76,76,76]',\n  'label &quot;-1.7&quot;',\n  'select atomno = 2',\n  'color atom  [76,76,76]',\n  'label &quot;0.0&quot;',\n  'select atomno = 3',\n  'color atom  [76,76,76]',\n  'label &quot;1.7&quot;',\n  'select atomno = 4',\n  'color atom  [76,76,76]',\n  'label &quot;-1.9&quot;',\n  'select atomno = 5',\n  'color atom  [76,76,76]',\n  'label &quot;0.0&quot;',\n  'select atomno = 6',\n  'color atom  [76,76,76]',\n  'label &quot;1.9&quot;',\n  'select atomno = 7',\n  'color atom  [76,76,76]',\n  'label &quot;-2.0&quot;',\n  'select atomno = 8',\n  'color atom  [76,76,76]',\n  'label &quot;0.0&quot;',\n  'select atomno = 9',\n  'color atom  [76,76,76]',\n  'label &quot;2.0&quot;',\n  'isosurface fullylit; pmesh o* fullylit; set antialiasdisplay on;',\n].join('\\n');;\n    var Info = {\n      width: '100%',\n      height: '500',\n      debug: false,\n      disableInitialConsole: true,   // very slow when used with inline mesh\n      color: '#3131ff',\n      addSelectionOptions: false,\n      use: 'HTML5',\n      j2sPath: '/nbextensions/jsmol/j2s',\n      script: script,\n    };\n    var jmolApplet0 = Jmol.getApplet('jmolApplet0', Info);\n  </script>\n</body>\n</html>\n\" \n        width=\"100%\"\n        height=\"500\"\n        style=\"border: 0;\">\n</iframe>\n",
      "text/plain": [
       "Graphics3d Object"
      ]
     },
     "execution_count": 66,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dodecahedron((0,0,0),2).show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"\"/>"
      ],
      "text/plain": [
       "Animation with 2 frames"
      ]
     },
     "execution_count": 61,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g1=line([(0,0),(100,100)])\n",
    "g2=polygon([(0,0),(50,100),(30,225),(100,38)])\n",
    "#show(g1+g2)\n",
    "animate([g1,g2]).show(delay=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495"
      ]
     },
     "execution_count": 55,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f22cb5c3fea54baa8cf8fcc9b2bbb705",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGYgYXQgMHg3ZjFjOTA4YWQyMzA+IHdpdGggMyB3aWRnZXRzCiAgbjogRHJvcGRvd24oZGVzY3JpcHRpb249dSduJywgb3B0aW9ucz0oMCzigKY=\n"
      ]
     },
     "execution_count": 1,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "@interact\n",
    "def f(n=[0..4], s=(1..5), c=Color(\"red\")):\n",
    "  var(\"x\");show(plot(sin(n+x^s),-pi,pi,color=c))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1/4*sqrt(5) + 1/4"
      ]
     },
     "execution_count": 49,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tanh(1.2)\n",
    "sin(pi/5)\n",
    "cos(pi/5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495"
      ]
     },
     "execution_count": 54,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "euler_gamma.n(digits=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Hl'"
      ]
     },
     "execution_count": 32,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s=\"Hello\"\n",
    "s[0:4:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
   ],
   "source": [
    "def f(i): return i  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [
   ],
   "source": [
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3628800"
      ]
     },
     "execution_count": 42,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prod(f(i) for i in (1..10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "GraphGenerators instance has no attribute '_'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-16-b0565a9c45b6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mgraphs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/home/sage/sage-8.1/src/sage/misc/lazy_import.pyx\u001b[0m in \u001b[0;36msage.misc.lazy_import.LazyImport.__getattr__ (build/cythonized/sage/misc/lazy_import.c:3555)\u001b[0;34m()\u001b[0m\n\u001b[1;32m    320\u001b[0m             \u001b[0mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    321\u001b[0m         \"\"\"\n\u001b[0;32m--> 322\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    323\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    324\u001b[0m     \u001b[0;31m# We need to wrap all the slot methods, as they are not forwarded\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: GraphGenerators instance has no attribute '_'"
     ]
    }
   ],
   "source": [
    "graphs._"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [
   ],
   "source": [
    "search_doc('prime')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [
   ],
   "source": [
    "search_src(\"graph\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [
   ],
   "source": [
    "*div?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[47, 178481]"
      ]
     },
     "execution_count": 9,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prime_divisors(2^23-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "Graphics object consisting of 1 graphics primitive"
      ]
     },
     "execution_count": 12,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot(prime_pi, 50, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [
   ],
   "source": [
    "prime_pi??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541]\n"
     ]
    }
   ],
   "source": [
    "print(primes_first_n(100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "Graphics object consisting of 44 graphics primitives"
      ]
     },
     "execution_count": 1,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g = graphs.WheelGraph(15)\n",
    "g.plot().show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### interact"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6f200fc615f14610882a2beb95d0ddcd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGYgYXQgMHg3ZmVjMjNjMTczMjA+IHdpdGggMSB3aWRnZXQKICB4OiBJbnRTbGlkZXIodmFsdWU9NSwgZGVzY3JpcHRpb249dSd4JywgbWHigKY=\n"
      ]
     },
     "execution_count": 3,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    " @interact\n",
    "def f(x=(0,10)):\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2962a7aa116246d1a1f0f2e4ac6ef01e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIG15ZnVuYyBhdCAweDdmZWUxYjA1M2EyOD4gd2l0aCAzIHdpZGdldHMKICB4OiBJbnRTbGlkZXIodmFsdWU9MTAsIGRlc2NyaXB0aW9uPXXigKY=\n"
      ]
     },
     "execution_count": 4,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sage.repl.ipython_kernel.interact import sage_interactive\n",
    "def myfunc(x=10, y=\"hello\", z=None): pass\n",
    "sage_interactive(myfunc, x=(0,100), z=[\"one\", \"two\", \"three\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f40f019da47e4117adeb11a673d0e8d7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIHByb3RlaW5fYnJvd3NlciBhdCAweDdmZWMyMzRkZDc1OD4gd2l0aCAyIHdpZGdldHMKICBHZW5CYW5rX0lEOiBUcmFuc2Zvcm1UZXh0KHbigKY=\n"
      ]
     },
     "execution_count": 7,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import urllib2 as U\n",
    "@interact\n",
    "def protein_browser(GenBank_ID = input_box('165940577', type = str), file_type = selector([(1,'fasta'),(2,'GenPept')])):\n",
    "    if file_type == 2:\n",
    "        gen_str = 'http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=protein&sendto=t&id='\n",
    "    else:\n",
    "        gen_str = 'http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=protein&sendto=t&dopt=fasta&id='\n",
    "    f = U.urlopen(gen_str + GenBank_ID)\n",
    "    g = f.read()\n",
    "    f.close()\n",
    "    html(g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "11b903906bce4a63839f40d259b2ec6e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGNvYWxlc2NlbnRzIGF0IDB4N2ZlYzIzNGRkNTAwPiB3aXRoIDMgd2lkZ2V0cwogIHBvcF9zaXplOiBUcmFuc2Zvcm1JbnRTbGlkZXIodmHigKY=\n"
      ]
     },
     "execution_count": 8,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Coalescent simulator\n",
    "#by Marshall Hampton [sagecell-issues]\n",
    "def next_gen(x, selection=1.0):\n",
    "    '''Creates the next generation from the previous; also returns parent-child indexing list'''\n",
    "    next_x = []\n",
    "    for ind in range(len(x)):\n",
    "        if random() < (1 + selection)/len(x):\n",
    "            rind = 0\n",
    "        else:\n",
    "            rind = int(round(random()*(len(x)-1)+1/2))\n",
    "        next_x.append((x[rind],rind))\n",
    "    next_x.sort()\n",
    "    return [[x[0] for x in next_x],[x[1] for x in next_x]]\n",
    "def coal_plot(some_data):\n",
    "    '''Creates a graphics object from coalescent data'''\n",
    "    gens = some_data[0]\n",
    "    inds = some_data[1]\n",
    "    gen_lines = line([[0,0]])\n",
    "    pts = Graphics()\n",
    "    ngens = len(gens)\n",
    "    gen_size = len(gens[0])\n",
    "    for x in range(gen_size):\n",
    "        pts += point((x,ngens-1), hue = gens[0][x]/float(gen_size*1.1))\n",
    "    p_frame = line([[-.5,-.5],[-.5,ngens-.5], [gen_size-.5,ngens-.5], [gen_size-.5,-.5], [-.5,-.5]])\n",
    "    for g in range(1,ngens):\n",
    "        for x in range(gen_size):\n",
    "            old_x = inds[g-1][x]\n",
    "            gen_lines += line([[x,ngens-g-1],[old_x,ngens-g]], hue = gens[g-1][old_x]/float(gen_size*1.1))\n",
    "            pts += point((x,ngens-g-1), hue = gens[g][x]/float(gen_size*1.1))\n",
    "    return pts+gen_lines+p_frame\n",
    "d_field = RealField(10)\n",
    "@interact\n",
    "def coalescents(pop_size = slider(2,100,1,15,'Population size'), selection = slider(-1,1,.1,0, 'Selection for first taxon'), s = selector(['Again!'], label='Refresh', buttons=True)):\n",
    "    print('Population size: ' + str(pop_size))\n",
    "    print('Selection coefficient for first taxon: ' + str(d_field(selection)))\n",
    "    start = [i for i in range(pop_size)]\n",
    "    gens = [start]\n",
    "    inds = []\n",
    "    while gens[-1][0] != gens[-1][-1]:\n",
    "        g_index = len(gens) - 1\n",
    "        n_gen = next_gen(gens[g_index], selection = selection)\n",
    "        gens.append(n_gen[0])\n",
    "        inds.append(n_gen[1])\n",
    "        coal_data1 = [gens,inds]\n",
    "    print('Generations until coalescence: ' + str(len(gens)))\n",
    "    show(coal_plot(coal_data1), axes = False, figsize = [8, 4.0*len(gens)/pop_size], ymax = len(gens)-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h1>Shift Cipher Encryptor</h1>"
      ],
      "text/plain": [
       "<h1>Shift Cipher Encryptor</h1>"
      ]
     },
     "execution_count": 9,
     "metadata": {
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<h>Put your message inside the provided quotes (with no additional quotes or apostrophes!), and select your desired shift:<h>"
      ],
      "text/plain": [
       "<h>Put your message inside the provided quotes (with no additional quotes or apostrophes!), and select your desired shift:<h>"
      ]
     },
     "execution_count": 9,
     "metadata": {
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7c925e9990cd413386d4266f8f3c83f2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIHNoaWZ0X2NpcGhlciBhdCAweDdmZWMxZjgxMjBjOD4gd2l0aCAyIHdpZGdldHMKICBtZXNzYWdlOiBFdmFsVGV4dCh2YWx1ZT11JyJzZWPigKY=\n"
      ]
     },
     "execution_count": 9,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Shift Cipher Encryption\n",
    "#by Sarah Arpin, Alexis Newton\n",
    "\n",
    "#You can use this interact to encrypt a message with a shift cipher.\n",
    "#Last edited 8/7/19 2:45pm\n",
    "pretty_print(html(\"<h1>Shift Cipher Encryptor</h1>\"))\n",
    "pretty_print(html(\"<h>Put your message inside the provided quotes (with no additional quotes or apostrophes!), and select your desired shift:<h>\"))\n",
    "@interact\n",
    "def shift_cipher(message = input_box(default='\"secrets\"', label=\"Message:\"), shift=slider(0,25,1,3, label=\"Shift by:\")):\n",
    "    A = AlphabeticStrings()\n",
    "    S = ShiftCryptosystem(A)\n",
    "    message = S.encoding(message)\n",
    "    C = S.enciphering(shift, message)\n",
    "    print \"This is your encrypted text shifted by\",shift,\":\"\n",
    "    print C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h1>Frequency Analysis Decryption Guesser</h1>"
      ],
      "text/plain": [
       "<h1>Frequency Analysis Decryption Guesser</h1>"
      ]
     },
     "execution_count": 10,
     "metadata": {
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<h>Warning: the shorter the input text is, the less accurate the distribution will be.<h>"
      ],
      "text/plain": [
       "<h>Warning: the shorter the input text is, the less accurate the distribution will be.<h>"
      ]
     },
     "execution_count": 10,
     "metadata": {
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "dbfcaf438b58439ea1bd02f74dc259e6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGZyZXF1ZW5jeUFuYWx5c2lzIGF0IDB4N2ZlYzIzYzJiMTQwPiB3aXRoIDEgd2lkZ2V0CiAgdGV4dDogRXZhbFRleHQodmFsdWU9dSciTnnigKY=\n"
      ]
     },
     "execution_count": 10,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Last edited 8/8/19 at 2:54pm\n",
    "\n",
    "pretty_print(html(\"<h1>Frequency Analysis Decryption Guesser</h1>\"))\n",
    "pretty_print(html(\"<h>Warning: the shorter the input text is, the less accurate the distribution will be.<h>\"))\n",
    "@interact \n",
    "# Initial text is \"Greetiiiings my name is Weeegbert Deuce the True Eater of the Toupee. Hear ye, hear ye! Dee dee dee. A head of these liger cubs carrying the trippy tomahawks are coming fo' thee. Take shelters in the tombs. Tammy ran to the other townspeople and aardvarks. What is her ETA? Her ETA please! Toil, bring your food cups and oil and be swift. The women and the child Occotion CIII should pick bamboo at Atitisoting. See? Nanna Wu Shacah's inner noodle cups: not nuutty sesame notions.\"\n",
    "def frequencyAnalysis(text = input_box('\"Nyllappppunz tf uhtl pz Dlllnilya Klbjl aol Aybl Lhaly vm aol Avbwll. Olhy fl, olhy fl! Kll kll kll. H olhk vm aolzl spnly jbiz jhyyfpun aol aypwwf avthohdrz hyl jvtpun mv aoll. Ahrl zolsalyz pu aol avtiz. Ahttf yhu av aol vaoly avduzwlvwsl huk hhykchyrz. Doha pz oly LAH? Oly LAH wslhzl! Avps, iypun fvby mvvk jbwz huk vps huk il zdpma. Aol dvtlu huk aol jopsk Vjjvapvu JPPP zovbsk wpjr ihtivv ha Hapapzvapun. Zll.Uhuuh Db Zohjho z puuly uvvksl jbwz: uva ubbaaf zlzhtl uvapvuz.\"', label = \"Message:\",width = 150)):\n",
    "    alphabet= AlphabeticStrings()\n",
    "    englishText =alphabet.encoding(text)\n",
    "    L1 = englishText.frequency_distribution().function()\n",
    "    L1=[x for x in L1.items()] \n",
    "    L1.sort(key=lambda x:x[1],reverse=True)\n",
    "    alphafreq = ['E','T','A','O','I','N','S','H','R','D','L','U','C','M','F','W','Y','P','V','B','G','K','J','Q','X','Z']\n",
    "    translator={}\n",
    "    for i in range(0, len(L1)):\n",
    "        translator.update({str(L1[i][0]):alphafreq[i]})\n",
    "        answer=\"\"\n",
    "    print \"\\nThe suggested substitutions, based on letter frequency are:\"\n",
    "    print translator\n",
    "    for char in englishText:\n",
    "        answer+= translator[str(char)]\n",
    "    print \"\\nThe suggested translation is:\\n\", answer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[0;31mType:\u001b[0m           Expression\n",
       "\u001b[0;31mString form:\u001b[0m    log2\n",
       "\u001b[0;31mLength:\u001b[0m         0\n",
       "\u001b[0;31mFile:\u001b[0m           /ext/sage/sage-8.8_1804/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx\n",
       "\u001b[0;31mDocstring:\u001b[0m     \n",
       "   Nearly all expressions are created by calling\n",
       "   new_Expression_from_*, but we need to make sure this at least does\n",
       "   not leave self._gobj uninitialized and segfault.\n",
       "\u001b[0;31mInit docstring:\u001b[0m\n",
       "   Nearly all expressions are created by calling\n",
       "   new_Expression_from_*, but we need to make sure this at least does\n",
       "   not leave self._gobj uninitialized and segfault.\n",
       "\u001b[0;31mCall docstring:\u001b[0m\n",
       "   Call the \"subs()\" on this expression.\n",
       "\n",
       "   EXAMPLES:\n",
       "\n",
       "      sage: var('x,y,z')\n",
       "      (x, y, z)\n",
       "      sage: (x+y)(x=z^2, y=x^y)\n",
       "      z^2 + x^y\n"
      ]
     },
     "execution_count": 11,
     "metadata": {
     },
     "output_type": "execute_result",
     "start": 0
    }
   ],
   "source": [
    "log2?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "Graphics object consisting of 1 graphics primitive"
      ]
     },
     "execution_count": 12,
     "metadata": {
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot_step_function([(i,prime_pi(i)) for i in range(20)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath (stable)",
   "language": "sagemath",
   "metadata": {
    "cocalc": {
     "description": "Open-source mathematical software system",
     "priority": 10,
     "url": "https://www.sagemath.org/"
    }
   },
   "name": "sagemath"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}